/* 
> 动机：
    1. 对于可变数据，我偏爱对象；
    2. 对于不可变数据，可以直接保存在记录里。

> 做法：
    1. 对持有记录的变量使用【封装变量】，将其封装到一个函数中；
    2. 创建一个类，将记录包装起来，并将记录变量的值替换为该类的一个实例。然后在类上定义一个访问函数，用于返回原始的记录。修改封装变量的函数，令其使用这个访问函数；
    3. 测试；
    4. 新建一个函数，让它返回该类的对象，而非那条原始的记录；
    5. 对于该记录的每处使用点，将原先返回记录的函数替换为哪个返回实例对象的函数调用。适用对象上的访问函数来获取数据的字段，如果该字段的访问函数还不存在，那就创建一个。每次更改之后测试；
    6. 移除类对原始记录的访问函数，哪个容易搜索的返回原始数据的函数也要一并删除；
    7. 测试；
    8. 如果记录中的字段本身也是复杂结构，考虑对其再次应用【封装记录】或【封装集合】手法。
*/
const organization = { name: "Acme Gooseberries", country: "GB" };
result += organization.name;
organization.name = newName;

/******************************************************* */
function getRawDataOfOrganization() {
    return organization;
}
result += getRawDataOfOrganization().name;
getRawDataOfOrganization().name = newName;
/******************************************************* */
class Organization {
    constructor(data) {
        this._name = data.name;
        this._country = data.country;
    }

    setName(aString){
        this._data.name = aString;
    }

    getName(){
        return this.name;
    }

    setCountry(aCountry){
        this._country = aCountry;
    }

    getCountry(){
        return this._country;
    }

}

const organization = new Organization({ name: "Acme Gooseberries", country: "GB"});
function getOrganization(){
    return organization;
}

result += getOrganization().name;
getOrganization().name = newName;
